Presently, two major methods of testing a computing system are that of static and dynamic testing. In static testing, a sequence of operations is specifically selected. A number of expected reactions are determined. A selected sequence of operations is then executed, and the tester verifies that observed reactions match the expected reactions. Static tests are relatively easy to write and usually are the first type of testing done.
In dynamic testing, a code's reaction to variables that change with time is examined. Two types of dynamic testing are stochastic testing and model-based testing. In stochastic testing, a sequence of operations is randomly selected, executed against a system, and the reactions are observed. The system under test typically passes individual tests, but the goal of stochastic testing is to see if the system can pass a large number of individual tests.
Model-based testing allows for a more focused method than that of stochastic testing. In model-based testing, a large number of sequences of operations are randomly selected according to what operations are likely or possible based on previous operations. These operations are then executed against a system, and the reactions are observed. Generally, model-based testing applies tests randomly selected from all possible sequences of operations within a system's search space to a system.
There exist many limitations though to the current state of technology with respect to testing systems. While static tests are easy to write, they are difficult to keep up-to-date due to the rapid increase in the demand for enhanced tests. Another limitation to static testing is the pesticide paradox problem, wherein only the bugs in the code covered by the static tests are found and fixed. Problems that might be found by a large number of randomly selected tests, such as is done in stochastic testing, may be missed.
While stochastic testing may address the pesticide paradox problem, it also has its limitations. For example, while stochastic testing randomly selects a large number of sequences of operations to execute, this method is not very focused. Additionally, while the refined model-based testing allows for a more focused test, it involves a very broad search space, parts of which may be tested unnecessarily.